package com.bestcem.xm.user.dao.mapper;

import com.bestcem.xm.user.entity.mysql.User;
import com.bestcem.xm.user.entity.pojo.ListUserAccountDO;
import com.bestcem.xm.user.entity.pojo.UserAccountListDO;
import com.bestcem.xm.user.entity.pojo.UserConditionGroupDO;
import com.bestcem.xm.user.entity.pojo.UserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 账号mapper
 *
 * @author Linzhijian <zhijian.lin@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/17 15:01
 */
@Mapper
public interface UserAccountMapper {

    /**
     * 根据主键删除
     *
     * @param userId
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:35
     */
    int deleteByPrimaryKey(String userId);

    /**
     * 插入
     *
     * @param user
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:35
     */
    int insertSelective(User user);

    /**
     * 主键查询
     *
     * @param userId
     * @return User
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:35
     */
    User selectByPrimaryKey(String userId);

    /**
     * 根据主键批量更新
     *
     * @param roleId
     * @param status
     * @param userIds
     * @param limit
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:35
     */
    List<User> listByIds(String roleId, Integer status, List<String> userIds, Integer limit);

    /**
     * 根据主键更新
     *
     * @param user
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:35
     */
    int updateByPrimaryKeySelective(User user);

    /**
     * 根据orgId更新
     *
     * @param user
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:35
     */
    int updateByOrgIdSelective(User user);

    /**
     * 根据主键全量更新账号
     *
     * @param user
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    int updateByPrimaryKey(User user);

    /**
     * 账户手机邮箱是否重复判断
     *
     * @param orgId  : 公司id
     * @param phone  : 手机
     * @param email  : 邮箱
     * @param userId : 待检查的用户id
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    Integer checkUserByEmailAndPhone(@Param("orgId") String orgId, @Param("phone") String phone, @Param("email") String email, @Param("userId") String userId);

    /**
     * 根据条件查询用户
     *
     * @param param
     * @return
     */
    List<User> selectBySelective(User param);


    /**
     * 可选条件查询单个用户
     *
     * @param param
     * @return com.bestcem.xm.user.entity.mysql.User
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/4 23:23
     */
    User getOneUserByFilter(User param);

    /**
     * 根据手机号或者邮箱查询用户列表信息
     *
     * @param phone 手机号
     * @param email 邮箱
     * @return void
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 14:01
     */
    List<User> getUserByPhoneOrEmail(@Param("phone") String phone, @Param("email") String email);

    /**
     * 根据orgId和邮箱或者手机号查询用户信息
     *
     * @param orgId 公司id
     * @param phone 手机号
     * @param email 邮箱
     * @return com.bestcem.xm.user.entity.pojo.UserDO
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 14:47
     */
    User getUserByOrgIdAndPhoneOrEmail(@Param("orgId") String orgId, @Param("phone") String phone, @Param("email") String email);

    /**
     * 获取用户列表
     *
     * @param accountDO
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    List<UserAccountListDO> getUserAccountList(ListUserAccountDO accountDO);

    /**
     * 获取用户总数
     *
     * @param accountDO
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    Long getUserAccountListCount(ListUserAccountDO accountDO);

    /**
     * 根据手机号和状态查询用户数量
     *
     * @param phone  手机号
     * @param status 用户状态
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/07 17:03
     */
    Integer countByPhoneAndStatus(@Param("phone") String phone, @Param("status") Integer status);


    /**
     * 根据用户id列表查询用户列表
     *
     * @param userIds 用户id列表
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/07 18:35
     */
    List<User> selectByIds(@Param("userIds") List<String> userIds);

    /**
     * 开放平台创建账号时检查 第三方id在我们系统中是否已存在
     *
     * @param orgId    : 公司id
     * @param silentId : 静默登录id
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/14 17:12
     */
    Integer checkUserBySilentId(@Param("orgId") String orgId, @Param("silentId") String silentId);

    /**
     * 根据orgId和关键字模糊检索用户名称或者邮箱信息
     *
     * @param orgId   公司id
     * @param biShare bishare
     * @param keyword 关键字[模糊配置：email、name、username、phone]
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.User>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/16 15:14
     */
    List<User> searchOrgIdBiShare(@Param("orgId") String orgId, @Param("biShare") Integer biShare, @Param("keyword") String keyword);


    /**
     * 更新未同意用户协议的账号
     *
     * @param accept
     * @param noAccept
     * @param updateTime
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    Integer updateUserAcceptFlag(@Param("accept") Integer accept, @Param("noAccept") Integer noAccept, @Param("updateTime") Date updateTime);

    /**
     * 更新是否内部用户
     *
     * @param inner
     * @param updateTime
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    Integer updateUserInnerFlag(@Param("innerFlag") Integer inner, @Param("updateTime") Date updateTime);

    /**
     * inner_flag为null的用户
     *
     * @param
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    List<UserDO> getUserInnerIsNull();

    /**
     * 可选参数查询
     *
     * @param user 查询参数
     * @return com.bestcem.xm.user.entity.pojo.UserDO
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/23 22:23
     */
    List<UserDO> selectByOrgIdSelective(UserDO user);

    /**
     * 根据create_time倒序查找
     *
     * @param user user数据
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.User>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/31 14:06
     */
    List<User> getUserListByCreateTimeSort(User user);

    /**
     * 根据邮箱或用户名查用户信息
     *
     * @param orgId    公司id
     * @param username 用户名
     * @param phone    手机号
     * @param email    邮箱
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.User>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/31 14:06
     */
    List<User> getUserListByUsernameOrEmailOrPhone(@Param("orgId") String orgId, @Param("username") String username, @Param("phone") String phone, @Param("email") String email);

    /**
     * 重置企业微信
     *
     * @param qyWxOpenUserid
     * @param updateTime
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/31 23:28
     */
    Integer updateUserByQyWxOpenUserid(@Param("qyWxOpenUserid") String qyWxOpenUserid, @Param("updateTime") Date updateTime);

    /**
     * 获取组织的用户数
     *
     * @param orgId orgId
     * @return Integer 用户数
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @date 2022/3/31 19:00
     */
    Integer countByOrgId(@Param("orgId") String orgId);

    /**
     * 根据相关参数查询用户列表信息
     *
     * @param orgId   租户id
     * @param search  检索关键字：将模糊匹配name或userName
     * @param status  状态
     * @param userIds 用户id列表
     * @param offset  偏移量
     * @param size    页大小
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/18 20:12
     */
    List<User> pageByNameOrUserNameOrEmail(@Param("orgId") String orgId, @Param("search") String search,
                                           @Param("status") Integer status, @Param("userIds") List<String> userIds,
                                           @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 根据相关参数查询用户数量
     *
     * @param orgId   租户id
     * @param search  检索关键字：将模糊匹配name或userName
     * @param status  状态
     * @param userIds 用户id列表
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/18 20:12
     */
    Long countByNameOrUserNameOrEmail(@Param("orgId") String orgId, @Param("search") String search,
                                      @Param("status") Integer status, @Param("userIds") List<String> userIds);


    /**
     * 分页获取绑定了组织的账号和系统管理员
     *
     * @param orgId  租户id
     * @param search 检索关键字：将模糊匹配name或email
     * @param status 状态
     * @param offset 偏移量
     * @param size   页大小
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/08 20:12
     */
    List<User> pageByNameOrEmailAndWithGroup(@Param("orgId") String orgId, @Param("search") String search,
                                             @Param("status") Integer status, @Param("offset") Integer offset, @Param("size") Integer size);


    /**
     * 获取绑定了组织的账号数量
     *
     * @param orgId  租户id
     * @param search 检索关键字：将模糊匹配name或userName
     * @param status 状态
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/08 20:12
     */
    Long countByNameOrEmailAndWithGroup(@Param("orgId") String orgId, @Param("search") String search, @Param("status") Integer status);


    /**
     * 邮箱或手机号查找用户并根据创建时间倒序
     *
     * @param status 用户状态
     * @param email  邮箱
     * @param phone  手机号
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.User>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/23 17:38
     */
    List<User> getUserByEmailOrPhone(@Param("status") Integer status, @Param("email") String email, @Param("phone") String phone);

    /**
     * 根据userName、phone、mobile查交集
     *
     * @param user 可选参数
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.User>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/15 20:31
     */
    List<User> listUserByOrCondition(User user);

    /**
     * 不包含禁用账号的计数
     *
     * @param orgId       公司id
     * @param status      禁用状态
     * @param biShareFlag 是否bi分享
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/06/18 21:57
     */
    Integer userAccountCount(@Param("orgId") String orgId, @Param("status") Integer status, @Param("biShareFlag") Integer biShareFlag);

    /**
     * 根据搜索条件查询用户列表失败
     *
     * @param userDO      用户搜索条件
     * @param statuses    用户状态
     * @param search      登录用户名，用户姓名模糊查询条件
     * @param tableFields 限定返回字段
     * @return 用户列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 11:13 2022/6/29
     */
    List<UserDO> listUsers(@Param("user") UserDO userDO, @Param("statuses") List<Integer> statuses,
                           @Param("search") String search, @Param("tableFields") String tableFields);

    /**
     * 用户解绑企业微信信息
     *
     * @param orgId      租户id
     * @param openUserid openId
     * @param updateTime 更新时间
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/29 15:26
     */
    void unbindWechatWork(@Param("orgId") String orgId, @Param("openUserid") String openUserid, @Param("updateTime") Date updateTime);

    /**
     * 用户解绑飞书信息
     *
     * @param orgId      租户id
     * @param openId     openId
     * @param updateTime 更新时间
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/29 15:26
     */
    void unbindFeishu(@Param("orgId") String orgId, @Param("openId") String openId, @Param("updateTime") Date updateTime);

    /**
     * 查找新公司所有角色为系统管理员的用户id
     *
     * @param dstOrgId       新公司id
     * @param dstAdminRoleId 新公司系统管理员角色id
     * @return java.lang.String
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/3 18:33
     */
    List<String> listByRoleIdJoinUserRole(String dstOrgId, String dstAdminRoleId);

    /**
     * 根据角色Id和组织查询指定状态列表的用户列表
     *
     * @param roleId 角色id
     * @param orgId  组织id
     * @param status 状态列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/07 13:39
     */
    List<String> getUserIdsByRoleAndOrgAndStatus(@Param("roleId") String roleId, @Param("orgId") String orgId, @Param("status") List<Integer> status);

    /**
     * 根据orgId、email、用户id列表查询用户列表
     *
     * @param orgId   租戶id
     * @param email   邮箱
     * @param userIds 用户id列表
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/07 13:53
     */
    List<User> selectByOrgAndEmailAndUserIds(@Param("orgId") String orgId, @Param("email") String email, @Param("userIds") List<String> userIds);

    /**
     * 根据用户id列表更新相关用户信息
     *
     * @param userIds 用户id列表
     * @param user    用户信息
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/07 14:00
     */
    void updateByUserIds(@Param("userIds") List<String> userIds, @Param("user") User user);


    /**
     * 根据组织id和角色id获取用户
     *
     * @param groupIdList 组织id列表
     * @param roleIdList  角色id列表
     * @return 满足条件的用户id列表
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/7/6 11:13
     */
    List<UserConditionGroupDO> listUsersByGroupIdAndRoleId(@Param("groupIdList") Set<String> groupIdList, @Param("roleIdList") Set<String> roleIdList);


    /**
     * 用户微信解绑
     *
     * @param userId 用户id
     * @return 操作数据条数
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/7/13 16:52
     */
    Integer unbindWechatByUserId(@Param("userId") String userId);


    /**
     * 用户微信绑定
     *
     * @param userId     用户id
     * @param unionId    微信unionId
     * @param offiOpenId 微信公众号openId
     * @param nickname   微信昵称
     * @return 操作数据条数
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/7/13 16:52
     */
    Integer bindWechat(@Param("userId") String userId, @Param("unionId") String unionId,
                       @Param("offiOpenId") String offiOpenId, @Param("nickname") String nickname);


    /**
     * 根据微信unionId查询用户
     *
     * @param unionId 微信unionId
     * @return 用户信息
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/7/13 16:52
     */
    User selectByWxUnionId(@Param("unionId") String unionId);

    /**
     * 根据orgId列表更新innerFlag字段
     *
     * @param orgIds     租户id
     * @param innerFlag  内部用户标识
     * @param updateTime 更新时间
     * @return void
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:36
     */
    void updateInnerFlagByOrgIds(@Param("orgIds") List<String> orgIds, @Param("innerFlag") Integer innerFlag, @Param("updateTime") Date updateTime);


    /**
     * 批量解绑租户下用户的企业微信
     *
     * @param orgId 租户id
     * @return 操作数据条数
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/7/18 14:44
     */
    Integer unbindWechatWorkByOrgId(@Param("orgId") String orgId);

    /**
     * 根据用户名查询用户信息(仅返回userId和userName)
     *
     * @param userNames
     * @param orgId
     * @return ServiceResult<List < UserDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/8/2 14:43
     */
    List<User> listIdsByUserName(@Param("userNames") Set<String> userNames, @Param("orgId") String orgId);

    /**
     * 根据orgId、phone、用户id列表查询用户列表
     *
     * @param orgId   租户id
     * @param phone   管理员手机号
     * @param userIds 用户id
     * @return
     */
    List<User> selectByOrgAndPhonePhoneAndUserIds(String orgId, String phone, List<String> userIds);

    /**
     * 更新账号
     *
     * @param user
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/18 20:30
     */
    int updateAccountById(User user);

    Long countUserByIds(@Param("userIds") List<String> userIds);

    /**
     * 根据相关参数查询用户列表信息
     */
    List<User> pageUserByIds(@Param("userIds") List<String> userIds, @Param("pageSize") int pageSize, @Param("offset") int offset);
}